// 图片上传中间件
// 腾讯云存储相关服务
const COS = require('cos-nodejs-sdk-v5')

// 使用临时内存存储图片
const multer = require('multer')
const path = require('path')

// 生成随机ID
const { v4: uuidV4 } = require('uuid')

// 初始化COS SDK
const cos = new COS({
  SecretId: 'AKIDMxSo2GVoDi9UfeRfnjZCcpoV6f5Qc8Vf',
  SecretKey: '1oNipiMwX8dEakgOt9IWdWBdrrdBVP5X',
})

// 创建上传图片的中间件工厂函数
const createUploadMiddleware = (prefix) => {
  // 配置multer存储引擎，这里使用内存存储作为临时存储
  const storage = multer.memoryStorage()
  const upload = multer({ storage: storage })

  return async (req, res, next) => {
    const Region = 'ap-beijing'

    try {
      // 封装multer的处理为一个Promise
      return new Promise((resolve, reject) => {
        // 使用 multer 的 single 方法处理名为 'file' 的文件上传字段  
        upload.single('file')(req, null, (err) => {
          if (err) {
            reject(err) //如果multer出错，直接拒绝Promise
          } else if (!req.file) {
            return res.status(400).json({
              err: '没有选择文件上传'
            })
          } else {
            resolve(req)  //如果成功，将req传递给下一个步骤
          }
        });
      }).then(async (req) => {
        // 文件信息  
        const file = req.file;

        // 使用UUID生成唯一的文件名
        const uuid = uuidV4()

        const originalExtension = path.extname(file.originalname)  //获取原始文件扩展名

        const fileNameWithUuid = `${uuid}${originalExtension}`; // 附加UUID到扩展名前

        const filePath = `${prefix}/${fileNameWithUuid}`; // 设置存储桶中的文件路径

        // 使用 COS SDK 上传文件  
        try {
          await new Promise((resolve, reject) => {
            cos.putObject({
              Bucket: 'leyouhui-1327374532', // 替换为你的存储桶名称和APPID  
              Region: Region, // 替换为你的存储桶所在地域  
              Key: filePath, // 存储桶中的文件路径  
              Body: file.buffer, // 文件内容  
            }, (err, data) => {
              if (err) {
                reject(err);
              } else {
                resolve(data);
              }
            });
          });

          // 上传成功  
          // 这里可以获取文件的URL，但通常你需要根据COS的访问域名和文件路径拼接  
          const fileUrl = `https://leyouhui-1327374532.cos.${Region}.myqcloud.com/${filePath}`;

          res.status(200).json({
            title: '上传图片成功',
            url: fileUrl
          })
        } catch (error) {
          // 捕获COS上传时的错误
          res.status(500).json({
            error: '上传图片失败',
            message: error.message || '服务器内部错误'
          })
        }

      });
    } catch (error) {
      // 捕获所有可能发生的错误  
      console.error('上传房源图片时发生错误:', error);
      res.status(500).json({ error: error.message });
    }
  }
}

module.exports = {
  createUploadMiddleware
}